package offer;

import java.util.Arrays;

/**
 * @author LongYongjiang
 * @since  2022-04-26
 */
@FunctionalInterface
public interface ProjectArea {
    /**
     * 在 n x n 的网格 grid 中，我们放置了一些与 x，y，z 三轴对齐的 1 x 1 x 1 立方体。
     * 每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上。
     * 现在，我们查看这些立方体在 xy 、yz 和 zx 平面上的投影。
     * 投影 就像影子，将 三维 形体映射到一个 二维 平面上。从顶部、前面和侧面看立方体时，我们会看到“影子”。
     * @param grid      立方体
     * @return          所有三个投影的总面积
     */
    int projectionArea(int[][] grid);
}
class ProjectAreaImpl1 implements ProjectArea{
    @Override
    public int projectionArea(int[][] grid) {
        int areaXY = getAreaXY(grid);
        int areaYZ = getAreaYZ(grid);
        int areaZX = getAreaZX(grid);
        return areaXY + areaYZ + areaZX;
    }
    private int getAreaXY(int[][] grid){
        int area = 0;
        for (int[] row : grid) {
            for (int height : row) {
                if(height > 0){
                    area++;
                }
            }
        }
        return area;
    }
    private int getAreaYZ(int[][] grid){
        int area = 0;
        for (int[] row : grid) {
            area += Arrays.stream(row).max().orElse(0);
        }
        return area;
    }
    private int getAreaZX(int[][] grid){
        int area = 0;
        int m = grid.length, n = grid[0].length;
        for(int j = 0; j < n; j++){
            int maxHeight = 0;
            for(int i = 0; i < m; i++){
                if(grid[i][j] > maxHeight){
                    maxHeight = grid[i][j];
                }
            }
            area += maxHeight;
        }
        return area;
    }
}